文件类型
文件类型有普通文件、目录问及那、设备文件、socket文件、符号链接 文件、命名管道文件等
文件类型是创建文件的时候建立的.并且一经创建, 类型无法修改.
许可位与特殊属性位
每个文件都有9位的许可权限和 3 位的特殊属性, 他们是在文件创建的时候 建立的, 创建后, 它们可以被 chmod 系统调用修改
fd = creat("newfile", 0744);
creat 的第二个参数指定了要创建文件的许可位, 这个参数只是请求, 而 不是命令.内核会通过 "新建文件掩码" 来得到文件的最终模式.
新建文件掩码
新建文件掩码 是一个很有用的系统变量, 它指定哪些位需要被关掉. 例如防止程序创建能被同组用户和其他用户修改的文件, 可以通过 关掉 ---w--w- 来实现. 这可以通过吧 "新建文件掩码" 的值设置为 八进制数 022 来实现.
umask(022);
这里 umask 是一个系统命令, 可以改变变量 umask 的值
改变文件的模式
程序可以通过系统调用 chmod 来改变文件模式
chmod("/tmp/myfile", 04764); chmod("/tmp/myfile", S_ISUID|S_IRWXU|S_IRGRP|S_IWGRP|S_IROTH);
系统调用 chmod 不受 "新建文件掩码" 的影响
chmod | |
---|---|
目标 | 修改文件的许可权限和特殊属性 |
头文件 | #include <sys/types.h> / #include <sys/stat.h> |
原型 | int result = chmod(char *path, mode_t mode); |
参数 | path 路径/mode 新的许可权限和特殊属性 |
返回值 | -1 error, 0 success |
文件的链接数
链接数就是文件被应用的次数
文件的所有者与组
每个文件都有文件的所有者, Unix 通过用户 ID 和组 ID 来标识文件 所有者和文件所属组
文件所有者
文件所有者就是创建文件的用户, 用户通过 creat 建立文件时, 内核把 所有者设为运行程序的用户, 如果程序具有 set-user-ID 位, 那么新文 件的文件所有者就是程序的文件所有者.
组
通常情况下, 新文件的组被设为执行创建动作的用户所在组. 有些情况下, 组会被设为与父目录的组相同.
修改文件所有者和组
通过系统调用 chown 来修改文件所有者和组
chown("file1", 200, 40);
chown | |
---|---|
目标 | 修改文件所有者和组 |
头文件 | #include <unistd.h> |
原型 | int chown(char *path, uid_t owner, gid_t group); |
参数 | path 文件名/owner 新的所有者ID/group 新的组ID |
返回值 | -1 error, 0 success |
文件大小
文件、目录和命令管道的大小是他们实际所占用的存储空间和字节数目.
时间
每个文件都有 3 个时间: 最后修改(modification)时间、最后访问(access) 时间和属性(如用户所有者ID、许可权限)修改时间.
当文件被操作时, 内核会自动的修改这些时间, 也可以编程来修改最后 修改时间和最后访问时间
utime | |
---|---|
目标 | 修改文件最后修改时间和最后访问时间 |
头文件 | #include<sys/time.h>/#include <utime.h>/#include<sys/types.h> |
原型 | int utime(char *path, struct utimbuf *newtimes) |
参数 | path 文件名/ newtimes 指向结构变量 utimbuf 的指针 |
返回值 | -1 错误, 0 成功 |
文件名
系统调用 creat 创建文件时会指定一个文件名.
系统调用 rename 可以修改文件/目录的名字, 还可以移动文件的位置.
rename | |
---|---|
目录 | 修改文件名活移动文件的位置 |
头文件 | #include <stdio.h> |
函数原型 | int result = rename(char *old, char *new) |
参数 | old 原来的文件名活目录名/new 新的文件名或目录名 |
返回值 | -1 错误 / 0 成功 |